package id3;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Collections;

/**
 *
 * @author Rodrigo
 */
public class Main {

	/**
	 * @param args the command line arguments
	 */
	public static void main(String[] args) {
		try {
			// Relleno con los posibles tipos de atributos que puede haber

			BufferedReader br = new BufferedReader(new FileReader("tiposatributos.data"));
			String line;
			int i = 0;
			ArbolDecision.tipoAtributos = new ArrayList();
			while ((line = br.readLine()) != null) {
				ArbolDecision.tipoAtributos.add(i, new ArrayList<Character>());
				String[] tipoAtrib = line.split(",");
				for (int j = 0; j < tipoAtrib.length; j++) {
					ArbolDecision.tipoAtributos.get(i).add(tipoAtrib[j].charAt(0));
				}
				i++;
			}

			// Cargo los datos de los ejemplos

			br = new BufferedReader(new FileReader("agaricus-lepiota.data"));
			AbstractCollection<Ejemplo> ejemplos = new ArrayList();
			while ((line = br.readLine()) != null) {
				String[] caracs = line.split(",");				
				i = 0;
				char[] listaCaracteres = new char[23];
				while (i < caracs.length) {					
					if (caracs[i].equals("?")) {
						caracs[i] = "b";						
					}
					listaCaracteres[i] = caracs[i].charAt(0);
					i++;
				}

				Ejemplo ej = new Ejemplo(listaCaracteres);
				ejemplos.add(ej);

			}
			AbstractCollection<Integer> atributos = new ArrayList();
			for (int j = 1; j < 23; j++) {
				atributos.add(j);
			}

			// Desordeno la colección para evitar que los datos esten sesgados
			Collections.shuffle((ArrayList)ejemplos);

			// Pruebo el algoritmo partiendo el conjunto en 10 y usando 1/10 para test y el resto para entrenamiento
			for (int k = 1; k <= 10; k++) {
				ArbolDecision.probar(ejemplos, k, (k % 10) + 1, atributos);
			}			
			
		} catch (Exception e) {
			System.out.println("Error: " + e.toString());
		}
	}
}
